#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


typedef int ElemType;
#define MaxSize 50
typedef struct {
    ElemType data[MaxSize];
    int top;
} SqStack;

void InitStack(SqStack &s) {
    s.top = -1;
}

bool StackEmpty(SqStack s) {
    return s.top == -1;
}

void Push(SqStack &s, ElemType num) {
    if (s.top == MaxSize - 1) {
        return;
    }
    s.data[++s.top] = num;
}

int Pop(SqStack &s) {
    if (StackEmpty(s)) return -1;
    return s.data[s.top--];

}
int evaluate(char *expression) {
    SqStack stack;
    InitStack(stack);

    char *token = strtok(expression, " ");
    while (token != NULL) {
        //  如果字符串是数字，就将其转换成整数并压入栈中；
        if (isdigit(token[0])) {
            Push(stack, atoi(token));//atoi函数一个专门将字符串转换为整数的库函数
        } else {//  如果字符串是运算符，就从栈中弹出两个操作数，进行计算，并将结果压入栈中
            int operand2 = Pop(stack);
            int operand1 = Pop(stack);
            switch (token[0]) {
                case '+':
                    Push(stack, operand1 + operand2);
                    break;
                case '-':
                    Push(stack, operand1 - operand2);
                    break;
                case '*':
                    Push(stack, operand1 * operand2);
                    break;
                case '/':
                    Push(stack, operand1 / operand2);
                    break;
                default:
                    printf("Error: Invalid operator %c\n", token[0]);
                    return -1;
            }
        }
        /**其中，第一个参数是待分割的字符串，第二个参数是用来指定分隔符的字符串。而在后续的调用中，第一个参数需要传入NULL，
         * 这是因为strtok()函数会将待分割的字符串保存在静态变量中，以便于下次调用时继续处理。
         * 因此，在后续的调用中，只需要传入NULL作为第一个参数，函数就会自动使用上一次处理的字符串继续处理。*/
        token = strtok(NULL, " ");
    }

    if (stack.top != 0) {
        printf("Error: Invalid expression\n");
        return -1;
    }
    //最终，栈中只剩下一个元素，就是计算结果。
    //将其返回即可
    return Pop(stack);
}

int main() {


    /**函数strtok的简单运用*/
/*   char str[] = "nihao,woaini,zhendeme";
   char *temp;
    temp = strtok(str, ",");
    while (temp) {
        puts(temp);
        temp = strtok(NULL, ",");
    }*/
    /**isdigit函数的运用*/
/*
    bool flag = isdigit(str[0]);
    printf("%d",flag);*/
    /**在上面的代码中，我们定义了一个SqlStack结构体，
     * 其中包含一个整型数组stack和一个整型变量top，用来表示栈顶元素的位置。Push函数用来将元素压入栈中，Pop函数用来弹出栈顶元素。
    *  在evaluate函数中，我们使用strtok函数将后缀表达式按照空格分割成多个字符串，然后依次处理每个字符串。
     如果字符串是数字，就将其转换成整数并压入栈中；如果字符串是运算符，就从栈中弹出两个操作数，进行计算，并将结果压入栈中。
     最终，栈中只剩下一个元素，就是计算结果。
    在main函数中，我们定义了一个后缀表达式6 3 / 2 4 * +，并调用evaluate函数计算其结果。*/
    char expression[] = "6 3 / 2 4 * +";
    int result = evaluate(expression);
    printf("%d\n", result);

    return 0;
}
